package estates.model;

import java.util.*;
import javax.persistence.*;

public class Oferta extends Estate {

  private int numer_oferty;
  private int typOferty;
  private int cena;
  private int powierzchnia;
  private String wojewodztwo;
  private String miejscowosc;
  private String opis;

  /*@OneToMany(mappedBy = "estate")
  private List<User> interestedUsers = new ArrayList<User>();*/

  private User user;

  private List<Comment> comments = new ArrayList<Comment>();

  public Oferta() {
	  
  }

  @Override
  public User getUser() {
    return user;
  }

  @Override
  public void setUser(User user) {
    this.user = user;
  }

  @Override
  public List<Comment> getComments() {
    return comments;
  }

  @Override
  public void setComments(List<Comment> comments) {
    this.comments = comments;
  }

  @Override
  public void dekoruj(HashMap<String, Object> hm) {
    //najpierw wstawic obligatoryjne zeby nie powtarzac kodu
    if (hm.containsKey("numer_oferty")) {
      this.numer_oferty = (Integer) hm.get("numer_oferty");
    }
    if (hm.containsKey("typ_oferty")) {
      this.typOferty = (Integer) hm.get("typ_oferty");
    }
    if (hm.containsKey("cena")) {
      this.cena = (Integer) hm.get("cena");
    }
    if (hm.containsKey("powierzchnia")) {
      this.powierzchnia = (Integer) hm.get("powierzchnia");
    }
    if (hm.containsKey("wojewodztwo")) {
      this.wojewodztwo = (String) hm.get("wojewodztwo");
    } else {
      this.wojewodztwo = "";
    }
    if (hm.containsKey("miejscowosc")) {
      this.miejscowosc = (String) hm.get("miejscowosc");
    } else {
      this.miejscowosc = "";
    }
    if (hm.containsKey("opis")) {
      this.opis = (String) hm.get("opis");
    } else {
      this.opis = "";
    }
  }

  public int getCena() {
    return cena;
  }

  public void setCena(int cena) {
    this.cena = cena;
  }

  public String getMiejscowosc() {
    return miejscowosc;
  }

  public void setMiejscowosc(String miejscowosc) {
    this.miejscowosc = miejscowosc;
  }

  @Override
  public int getNumer_oferty() {
    return numer_oferty;
  }

  @Override
  public void setNumer_oferty(int numer_oferty) {
    this.numer_oferty = numer_oferty;
  }

  public String getOpis() {
    return opis;
  }

  public void setOpis(String opis) {
    this.opis = opis;
  }

  public int getPowierzchnia() {
    return powierzchnia;
  }

  public void setPowierzchnia(int powierzchnia) {
    this.powierzchnia = powierzchnia;
  }

  @Override
  public int getTypOferty() {
    return typOferty;
  }

  @Override
  public void setTypOferty(int typ_oferty) {
    this.typOferty = typ_oferty;
  }

  public String getWojewodztwo() {
    return wojewodztwo;
  }

  public void setWojewodztwo(String wojewodztwo) {
    this.wojewodztwo = wojewodztwo;
  }

  @Override
  public boolean equals(Object e) {
    if (!(e instanceof Estate)) {
      return false;
    }
    Estate pe = (Estate) e;
    return this.numer_oferty == pe.getNumer_oferty();
  }

  @Override
  public int hashCode() {
    int hash = 7;
    hash = 31 * hash + this.numer_oferty;
    hash = 31 * hash + this.typOferty;
    hash = 31 * hash + this.cena;
    hash = 31 * hash + this.powierzchnia;
    //    hash = 31 * hash + this.polozenie;
    hash = 31 * hash + (this.wojewodztwo != null ? this.wojewodztwo.hashCode() : 0);
    hash = 31 * hash + (this.miejscowosc != null ? this.miejscowosc.hashCode() : 0);
    hash = 31 * hash + (this.opis != null ? this.opis.hashCode() : 0);
    //    hash = 31 * hash + this.ksiega_wieczysta;
    return hash;
  }

  @Override
  public int compareTo(Estate arg1) {
    Oferta arg = (Oferta) arg1;
    if (getCena() != arg.getCena()) //sortowanie po większej cenie
    {
      return getCena() - arg.getCena();
    } else if (getPowierzchnia() != arg.getPowierzchnia()) //sortowanie po większym metrażu
    {
      return arg.getPowierzchnia() - getPowierzchnia();
    }
    return 0;
  }

  @Override
  public String toString() {
    String pom;
    pom = "numer_oferty=" + numer_oferty + "&typOferty=";
    if (typOferty == 0) {
      pom += "OfertaGruntowa";
    } else if (typOferty == 1) {
      pom += "OfertaBudynkowa";
    } else if (typOferty == 2) {
      pom += "OfertaLokalowa";
    }
    pom += "&cena=" + cena + "&powierzchnia=" +
            powierzchnia + "&wojewodztwo=" + wojewodztwo + "&miejscowosc=" + miejscowosc + "&opis=" + opis + "&User=" + this.getUser().getNIP();
    return pom;
  }

  @Override
  public int place(int by, int ilosc_kubkow) {
    switch (by) {
      case 0:
        return this.rPlaceByCzyRozkladowy(ilosc_kubkow);
      case 1:
        return this.rPlaceByLiczbaPieter(ilosc_kubkow);
      case 2:
        return this.rPlaceByRokBudowy(ilosc_kubkow);
      case 3:
        return this.rPlaceByliczbaPokoi(ilosc_kubkow);
      case 4:
        return this.rPlaceByMetraz(ilosc_kubkow);
      case 5:
        return this.rPlaceByCena(ilosc_kubkow);
      default:
        return 0;
    }
  }

  @Override
  public int rPlaceByCzyRozkladowy(int ilosc_kubkow) {
    return 0;
  }

  @Override
  public int rPlaceByLiczbaPieter(int ilosc_kubkow) {
    return Integer.MAX_VALUE % ilosc_kubkow;
  }

  @Override
  public int rPlaceByRokBudowy(int ilosc_kubkow) {
    return 0;
  }

  @Override
  public int rPlaceByliczbaPokoi(int ilosc_kubkow) {
    return 0;
  }

  @Override
  public int rPlaceByMetraz(int ilosc_kubkow) {
    return 0;
  }

  @Override
  public int rPlaceByCena(int ilosc_kubkow) {
    int ret = 0;
    if (cena >= 0 && cena < 500000) {
      ret = (cena / 1000) % ilosc_kubkow;// algorytm zaklada ze statystycznie bardzo rzadko ceny miekszan sa wieksze niz 500 tys, wtedy bowiem dziala niepoprawnie dla cen
    } else {
      ret = ilosc_kubkow - 1;// za wysoka lub ujemna cena moglaby byc nadużywana w pozycjonowaniu ofert, dlatego wpisujemy ja na koniec
    }
    return ret;
  }

  @Override
  public boolean isCommentAcceptable(Comment comment) {
    User _u = comment.getUser();
    if(this.getUser().equals(_u))return false;
    Iterator<Comment> iter = comments.iterator();
    int counter = 0;
    while (iter.hasNext()) {
      counter = (iter.next().getUser().equals(_u)) ? counter + 1 : counter;

      if (counter == 3) {
        return false;
      }
    }
    return true;
  }

  @Override
  public boolean matchesQuery(Estate wzorzec) {

    if (wzorzec.getCena() != 0 && this.getCena() != wzorzec.getCena()) {
      return false;
    }
    if (wzorzec.getTypOferty() != 0 && this.getTypOferty() != wzorzec.getTypOferty()) {
      return false;
    }
    if (wzorzec.getPowierzchnia() != 0 && this.getPowierzchnia() != wzorzec.getPowierzchnia()) {
      return false;
    }
    if (wzorzec.getWojewodztwo() != null
			&& !wzorzec.getWojewodztwo().equals("")
			&& !this.getWojewodztwo().equals(wzorzec.getWojewodztwo())) {
      return false;
    }
    if (wzorzec.getOpis() != null
			&& !wzorzec.getOpis().equals("")
			&& !this.getOpis().equals(wzorzec.getOpis())) {
      return false;
    }
    if (wzorzec.getUser() != null && !this.getUser().equals(wzorzec.getUser())) {
      return false;
    }
    return true;
  }

  @Override
  public HashMap<String, String> obliczSrednieOceny() {
	  return null;
  }

  @Override
  public Comment addComment(HashMap<String, Object> commentData, User user) {
	  Comment comment = Comment.createComment(commentData, user, this);

	  if(isCommentAcceptable(comment)) {
		comments.add(comment);
		comment.getUser().addComment(comment);
	    return comment;
	  }
	  return null;
  }

    /*@Override
    public List<User> getInterestedUsers() {
        return interestedUsers;
    }

    @Override
    public boolean setInterestedUser(User u) {
        interestedUsers.add(u);
        return true;
    }*/
}


